// 空间点线面的GIS基本算法数据结构
#ifndef GIS_MODEL_H
#define GIS_MODEL_H

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

/// @brief 二维点，二维向量
typedef struct
{
	double x, y; // 分别表示x，y坐标
} Point, Vector;

/// @brief 线段
typedef struct
{
	double startX, startY, endX, endY; // 起点x坐标，起点y坐标，终点x坐标，终点y坐标
} Line;

/// @brief 多边形
typedef struct
{
	Point *points;	// 构成多边形的点集数组
	int pointCount; // 多边形点的个数
} Polygon;

/// @brief 圆
typedef struct
{
	Point *center; // 圆心坐标
	double radius; // 圆半径
} Circle;

/// @brief 矩形
typedef struct
{
	Point *upLeft, *bottomRight; // 分别是左上角的点坐标，右下角点坐标
} Rectangle;

/// @brief 创建点对象
/// @param x 点的x坐标
/// @param y 点的y坐标
/// @return 点对象指针
Point *
createPoint(double, double);

/// @brief 创建向量对象
/// @param x 向量x坐标
/// @param y 向量y坐标
/// @return 向量对象指针
Vector *createVector(double, double);

/// @brief 通过两点创建一个向量
/// @param p1 起点指针
/// @param p2 终点指针
/// @return 向量对象指针
Vector *createVectorByTwoPoint(Point *, Point *);

/// @brief 通过一个线段创建一个向量
/// @param line 线段对象指针
/// @return 向量对象指针
Vector *createVectorByLine(Line *);

/// @brief 向量点乘
/// @param v1 向量1
/// @param v2 向量2
/// @return 两向量点乘的结果
double vectorPointProduct(Vector *, Vector *);

/// @brief 向量叉乘
/// @param v1 向量1
/// @param v2 向量2
/// @return 两向量叉乘的结果
double vectorCrossProduct(Vector *, Vector *);

/// @brief 获取向量长度
/// @param vector 向量指针
/// @return 向量长度
double vectorLength(Vector *);

/// @brief 获取两个向量夹角
/// @param v1 向量1
/// @param v2 向量2
/// @return 两向量夹角，角度制，范围0-180°
double vectorAngle(Vector *, Vector *);

/// @brief 创建线段对象
/// @param startX 起点x坐标
/// @param startY 起点y坐标
/// @param endX 终点x坐标
/// @param endY 终点y坐标
/// @return 线段对象
Line *createLine(double, double, double, double);

/// @brief 获取线段长度
/// @param line 线段指针
/// @return 线段长度
double lineLength(Line *);

/// @brief 创建多边形对象
/// @param points 构成多边形点的集合
/// @param n 多边形点的个数
/// @return 多边形的对象指针
Polygon *createPolygon(Point[], int);

/// @brief 创建圆对象
/// @param x 圆心x坐标
/// @param y 圆心y坐标
/// @param r 圆的半径
/// @return 圆的对象指针
Circle *createCircle(double, double, double);

/// @brief 创建矩形对象
/// @param upLeftX 左上角x坐标
/// @param upLeftY 左上角y坐标
/// @param bottomRightX 右下角x坐标
/// @param bottomRightY 右下角y坐标
/// @return 矩形的对象指针
Rectangle *createRectangle(double, double, double, double);

#include "./gis-model.c"

#endif